/*
 * $$Id: LogonAction.java,v 1.23 2004/05/31 07:51:14 bel70 Exp $$
 *
 * ***** BEGIN LICENSE BLOCK *****
 * The contents of this file are subject to the Mozilla Public License
 * Version 1.1 (the "License"); you may not use this file except in
 * compliance with the License. You may obtain a copy of the License
 * at http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS"
 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
 * the License for the specific language governing rights and
 * limitations under the License.
 *
 * The Original Code is jforum forum code.
 *
 * The Initial Developer of the Original Code is the JResearch, Org.
 * Portions created by the Initial Developer are Copyright (C) 2004
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s):
 *              Dmitry Belov <bel@jresearch.org>
 *
 * ***** END LICENSE BLOCK ***** */
package com.jred.jforum.actions.user;


import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.util.MessageResources;

import com.jred.jforum.IConst;
import com.jred.jforum.actions.BaseAction;
import com.jred.jforum.actions.common.TDDispatchAction;
import com.jred.jforum.beans.user.User;
import com.jred.jforum.exception.SystemException;
import com.jred.jforum.forms.LogonForm;
import com.jred.jforum.log.ForumLog;
import com.jred.jforum.service.ForumService;
import com.jred.jforum.service.UserService;
import com.jred.jforum.util.MD5Digest;

/**
 * Implementation of <strong>Action</strong> that validates a user logon.
 * 
 * @version $Revision: 1.23 $ $Date: 2004/05/31 07:51:14 $
 */
public final class LogAction extends TDDispatchAction {
	
	private static String ENABLE_FORUM_SIGN_ON = "N";
	private static String ENABLE_AUTO_LOGIN = "Y";
	
	/**
	 * 登录
	 * @param mapping
	 * @param form
	 * @param request
	 * @param response
	 * @return
	 * @throws SystemException
	 */
	public ActionForward logon(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws SystemException {
		if (IConst.VALUES.TRUE.equals(ENABLE_FORUM_SIGN_ON)) {
			return (mapping.findForward("jforum-denied"));
		}
		
		ForumService forumService = (ForumService)getServiceFacade("forumService");
		request.setAttribute("JFORUM_GROUPS", forumService.getGroups());

		HttpSession session = request.getSession();
		MessageResources messages = getResources(request);
		LogonForm logonForm = (LogonForm) form;
		User user = new User();

		ActionErrors errors = new ActionErrors();

		String username = logonForm.getUsername();
		String password = MD5Digest.digest(username, logonForm.getPassword());

		UserService userService = (UserService) getServiceFacade("userService");

		user = userService.getUser(username, password);
		user.setIp(request.getRemoteAddr());

		if (user.getStatus() == 0) {
			errors.add("logFalse", new ActionError(
					"forum.LOG_FAIL", new Object[] { response
							.encodeURL("ShowFogotPass.do?uid=" + username) }));
			ForumLog.getInstance().getForumLogger()
					.warn(
							request.getRemoteAddr() + " "
									+ messages.getMessage("logs.LOG2") + " "
									+ username);
		} else {
			session.setAttribute(IConst.SESSION.USER_KEY, user);
			session.removeAttribute(IConst.SESSION.GROUPS_KEY);
//			log(request, "logs.LOG1", session.getId());
		}

		// Report any errors we have discovered back to the original form
		if (!errors.isEmpty()) {
			saveErrors(request, errors);
			return (mapping.getInputForward());
		}

		// if
		// (IConst.VALUES.TRUE.equals(Configurator.getInstance().get(IConst.CONFIG.ENABLE_AUTO_LOGIN)))
		// {
		if (IConst.VALUES.TRUE.equals(ENABLE_AUTO_LOGIN)) {
			// set autolog cookies if needed...
			if (user.getSettings().isAutologin()) {
				Cookie userCookie = new Cookie(IConst.COOKIE.USER_COOKIE, user
						.getName()
						+ "*" + user.getPassword());
				userCookie.setMaxAge(IConst.COOKIE.SECONDS_PER_YEAR);
				((HttpServletResponse) response).addCookie(userCookie);
			}
		}

		// Remove the obsolete form bean
		if (mapping.getAttribute() != null) {
			if ("request".equals(mapping.getScope())) {
				request.removeAttribute(mapping.getAttribute());
			} else {
				session.removeAttribute(mapping.getAttribute());
			}
		}

		// Forward control to the specified success URI
		String redirectUri = logonForm.getRedirectUri();

		if ((redirectUri != null) && !redirectUri.equals("")) {
			return (new ActionForward(redirectUri, true));
		}

		return (mapping.findForward("welcome"));
	}
	
	/**
	 * 退出
	 * @param mapping
	 * @param form
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 */
	public ActionForward logout(ActionMapping mapping, ActionForm form,
	        HttpServletRequest request, HttpServletResponse response)
	        throws Exception {
	        //if (IConst.VALUES.FALSE.equals(Configurator.getInstance().get(IConst.CONFIG.ENABLE_FORUM_SIGN_ON))) {
	        if (IConst.VALUES.TRUE.equals("N")) {
	            return (mapping.findForward("jforum-denied"));
	        }

	        HttpSession session = request.getSession();
	        MessageResources messages = getResources(request);
	        User user = (User) session.getAttribute(IConst.SESSION.USER_KEY);

	        //if (IConst.VALUES.TRUE.equals(Configurator.getInstance().get(IConst.CONFIG.ENABLE_AUTO_LOGIN))) {
	        if (IConst.VALUES.TRUE.equals("N")) {
	            //		unset autolog cookies if needed...
	            if (user.getSettings().isAutologin()) {
	                Cookie userCookie = new Cookie(IConst.COOKIE.USER_COOKIE, "");
	                userCookie.setMaxAge(IConst.COOKIE.SECONDS_PER_YEAR);
	                ((HttpServletResponse) response).addCookie(userCookie);
	            }
	        }

	        ForumLog.getInstance().getForumLogger().info(request.getRemoteAddr() +
	            " " + user.getName() + " " + messages.getMessage("logs.LOG23") +
	            " " + session.getId());
	        session.invalidate();

	        return (mapping.findForward("welcome"));
	    }
}
